<?php
/**
 * SingletonRegistry-Klasse zur einmaligen globalen Speicherung eines Datensatzes (Object|Variable|...)
 *
 * @author		Joachim Ruf
 * @copyright	Copyright (c) 2003-2013 Loresoft Software (http://www.loresoft.de)
 * @license		http://yapary.loresoft.de/lizenzbedingungen     New BSD License
 *
 * */



Final Class Yapary_SingletonRegistry
{
	private static $instance;
	private $arrList;


	function __construct () {

	}


	/**
	 * @desc Gibt eine Singleton-Instanz aus.
	 * @return mixed
	 * */
	public static function getInstance () {
		if (self::$instance === NULL) {
			self::$instance = new self();
		}

		return self::$instance;
	}


	/**
	 * @desc Fuegt ein neues Element hinzu.
	 * @param string $name	:	Name, unter welchem das neue Objekt gespeichert werden soll
	 * @param mixed $object	:	Zu speicherndes Objekt (Object|Variable|...)
	 * @return void
	 * */
	public function __set ($name, $object) {
		if ($this->exists($name)) {
			throw new Exception("Object $name already exists. Please use delete() first");
		}

		$this->arrList[$name] = $object;
	}


	/**
	 * @desc Gibt ein gespeichertes Element aus.
	 * @param string $name	:	Name des Elements, welches ausgegeben werden soll
	 * @return mixed
	 * */
	public function __get ($name) {
		if (!$this->exists($name)) {
			throw new Exception("Object $name does not exist");
		}

		return $this->arrList[$name];
	}


	/**
	 * @desc Loescht ein vorhandenes Element aus der Registry.
	 * @param string $name	:	Name, des Objekts, welches geloescht werden soll
	 * @return boolean
	 * */
	public function delete ($name) {
		if (!$this->exists($name)) {
			throw new Exception("Object $name does not exist");
		}

		unset($this->arrList[$name]);
		return true;
	}


	/**
	 * @desc Prueft, ob das angegebene Objekt existiert.
	 * @return boolean
	 * */
	public function exists ($name) {
		if (!isset($this->arrList[$name])) {
			return false;
		}

		return true;
	}


	/**
	 * @desc Gibt eine Liste aller gespeicherten Objekte aus.
	 * @return array();
	 * */
	public function getList () {
		return $this->arrList;
	}


	/**
	 * @desc Gibt alle gespeicherten Elemente aus.
	 * @param string $name	:	Name des Objekts, dessen Dateityp ermittelt werden soll
	 * @return string
	 * */
	public function getType ($name) {
		if (!$this->exists($name)) {
			throw new Exception("Object $name does not exist");
		}

		return  gettype($this->arrList[$name]);
	}


	/**
	 * @desc Cloning deaktivieren.
	 */
	private function __clone () {}

}

